﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WPGame.Obstacle
{
    abstract class Obstacle : BaseObject.MyObject
    {
        enum TYPE
        {
            UP,
            DONW,
            LEFT,
            RIGHT,


        }
        protected int m_AmountDirMove;
        protected BaseObject.DIR[] m_dir;
        protected bool m_isHasOn;
        protected bool m_isRotate;

        #region Property
        /// <summary>
        /// Cho biết đối tượng có xoay được không
        /// </summary>
        public bool isRotate
        {
            get { return m_isRotate; }
            set { m_isRotate = value; }
        }
        /// <summary>
        /// Cho biết có charater trên đó không
        /// </summary>
        public bool isHasOn
        {
            get { return m_isHasOn; }
            set { m_isHasOn = value; }
        }
        #endregion

        public Obstacle(bool _isrotate, int _amountdirmove, int col, Rectangle baserect, Vector2? position = null, params BaseObject.DIR[] _dirlist)
            : base(col, baserect, position)
        {
            AmountDirRotate = _amountdirmove;
            m_dir = new BaseObject.DIR[_amountdirmove];
            setDir(_dirlist);
            isHasOn = false;
            isRotate = _isrotate;
        }

        /// <summary>
        /// Kiểm tra có cho phép đối tượng đi qua không
        /// </summary>
        /// <param name="_dynobj">Đối tượng động</param>
        /// <returns> true: cho phép</returns>
        /// <returns> false: không cho phép</returns>
        public bool isAllow(BaseObject.MyDynamicObject _dynobj)
        {
            foreach (BaseObject.DIR _dir in m_dir)
            {
                if (Math.Abs(((int)_dir - (int)_dynobj.Ability.Direction)) == 2)
                    return true;
            }
            return false;
        }

        /// <summary>
        /// Số hướng cho phép đi qua
        /// </summary>
        public int AmountDirRotate
        {
            get { return m_AmountDirMove; }
            protected set { m_AmountDirMove = value; }
        }

        /// <summary>
        /// Đặt lại Frame dựa vào số hướng cho phép đi vào hướng cho phép đi.
        /// Chưa định nghĩa
        /// </summary>
        protected override void setFrame()
        {
            throw new Exception();
        }

        /// <summary>
        /// Xoay hình một góc rad theo chiều kim đồng hồ
        /// </summary>
        /// <param name="rad"> nhận góc là bội của cho pi/2, đơn vị radian</param>
        /// <param name="_gametime"></param>
        public void Rotate(float rad, GameTime _gametime)
        {
            float temp = this.Sprite.Rotation;
            do
            {
                Timer.StopWatch(GGlobalSetting.FPS, _gametime);
                this.Sprite.Rotate();
            }
            while (this.Sprite.Rotation - temp < rad);

            //số lần góc phần tư (pi/2)
             int _temp = (int)Math.Round((double)rad / ((float) Math.PI/2));
             for (int i = 0; i < AmountDirRotate; i++)
             {
                 m_dir[i] = (BaseObject.DIR)((int)m_dir[i] + temp);
             }
        }

        public abstract void Update(BaseObject.MyDynamicObject _dynobj);


        /// <summary>
        /// gán các thuộc tính hướng
        /// </summary>
        /// <param name="_dirlist"></param>
        public void setDir(params BaseObject.DIR[] _dirlist)
        {
            if (_dirlist.Length > AmountDirRotate)
                throw new Exception();
            for (int i = 0; i < _dirlist.Length; i++)
            {
                m_dir[i] = _dirlist[i];
            }
        }

    }
}
